package org.summer.common.http;

import java.util.List;

/**
 * 分页数据构建处理器
 *
 * @param <T>
 */
public class PageBuilder<T> {
    private int page;
    private int size;
    private Long total;
    private PageBuilder() {}
    /**
     * 构建一个分页构建器
     *
     * @param <T> 处理数据类型
     */
    public static <T> PageBuilder<T> builder() {
        return new PageBuilder<T>();
    }

    /**
     * 初始化分页构建器
     *
     * @param page 当前页码
     * @param size 没页显示数据条数
     */
    public PageBuilder<T> init(Integer page, Integer size) {
        this.page = page;
        this.size = size;
        return this;
    }

    /**
     * 加载数据总量
     *
     * @param handler 获取数据总量的方法引用
     */
    public PageBuilder<T> total(PageTotalHandler handler) {
        this.total = handler.loadCount();
        return this;
    }

    /**
     * 构建分页数据
     *
     * @param handler 处理分页数据的方法引用
     */
    public Page<T> build(PageLoadDataHandler<T> handler) {
        List<T> data = handler.loadData(computeSelectStart(), size);
        return new Page<T>(page,size,computeTotalPage(),total,data);
    }

    /**
     * 计算总页数
     */
    private int computeTotalPage(){
       return total.intValue() / size +1 ;
    }

    /**
     * 计算查找位置
     */
    private int computeSelectStart(){
        return (this.page - 1) * this.size;
    }

}
